
#include <iostream>

using namespace std;

// 0
template<typename T, typename D> class A{
public:
	static void foo( ){
		cout << "0: A<T, D>" << endl;
	}
private:
};

// 1
template<typename T>class A<T, short>{
public:
	static void foo(){
		cout << "1: A<T, short>" << endl;
	}
};

// 2
template<typename T>class A<T, T>{
public:
	static void foo(){
		cout << "1: A<T, short>" << endl;
	}
};


template<typename T, typename D>class A<T*, D*>{
public:
	static void foo(){
		cout << "1: A<T, short>" << endl;
	}
};

int main( ){
	A<int, short>::foo();	// 1
//	A<short, short>::foo();	// 2 ? 1
//	A<int*, int*>::foo();	// 2 ? 3

	return 0;
}
